home *** CD-ROM | disk | FTP | other *** search
/ Mac-Source 1994 July / Mac-Source_July_1994.iso / Updates, etc. / PG PRO⁄PG Lite Demos / PG PRO Demo / PG PRO Demo.rsrc / FLTR_1004_ICN3 < prev    next >
Text File  |  1993-09-10  |  11KB  |  403 lines

  1. '==== ===========================================================================
  2. '=                         Copyright 1992 Staz™ Software, Inc.                 =
  3. '=                               All rights reserved                           =
  4. '=                              "ICN3.FLTR" from PG:PRO                        =
  5. '===============================================================================
  6. INCLUDE FILE _aplIncl
  7. COMPILE 0,_MacsbugLabels_strResource_caseInsensitive'set by PG:PRO
  8. GLOBALS "PG PRO.GLBL"'include standard global file
  9. END GLOBALS'no other globals
  10. DEFSTR LONG'needed for CVI's
  11. GOTO "ICN3"'quick jump around functions
  12. INCLUDE "@Header.INCL"
  13. _maxColor     = 65535
  14. '_______________________________________________________________________________
  15. LOCAL FN I3shade(shade,inColor)'∑∑œœœœœœœœœœœœœœœœœœœœœœœœœ∑∑
  16. '—————————————————————————————————————————————————————————————————————————————
  17. DIM red,green,blue
  18. LONG IF inColor
  19. `     MOVEQ   #0,D0
  20. `     MOVE.L  D0,^red
  21. `     MOVE.W  D0,^blue
  22.  
  23. IF gObjUser4& THEN midColor = 41500 ELSE midColor = 32766
  24. darkness = midColor + ((_maxColor / 9) * shade)
  25.  
  26. SELECT gObjUser4&
  27. CASE 0'gray
  28. red   = darkness
  29. green = darkness
  30. blue  = darkness
  31. CASE 1'red
  32. red   = darkness
  33. CASE 2'green
  34. green = darkness
  35. CASE 3'blue
  36. blue  = darkness
  37. CASE 4'red/green
  38. red   = darkness
  39. green = darkness
  40. CASE 5'green/blue
  41. green = darkness
  42. blue  = darkness
  43. CASE 6'red/blue
  44. red   = darkness
  45. blue  = darkness
  46. END SELECT
  47.  
  48. CALL RGBFORECOLOR(red)
  49.  
  50. XELSE'black & white
  51. CALL PENNORMAL
  52. CALL FORECOLOR(33)'set normal black & white
  53. CALL BACKCOLOR(30)
  54. CALL PENSIZE(1,1)
  55. CALL PENMODE(_patCopy)
  56. SELECT shade
  57. CASE > 0:CALL PENPAT(#REGISTER(A5)+_white)
  58. CASE   0:CALL PENPAT(#REGISTER(A5)+_gray)
  59. CASE < 0:CALL PENPAT(#REGISTER(A5)+_black)
  60. END SELECT
  61. END IF
  62. END FN
  63. '___________________________________________________________________________________
  64. LOCAL FN I3ICON(inColor)'∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑
  65. '—————————————————————————————————————————————————————————————————————————————————
  66. ' This function draws a color icon if practical; a black and white ICON if not.
  67. '
  68. DIM t,l,b,r
  69.  
  70. DIM srcBMap.bitMapRec'record used for bit map
  71. DIM maskBMap.bitMapRec'record used for mask
  72. '
  73. '              Center icon in object's rectangle
  74. '
  75. t = (gObjB-gObjT)/2 + gObjT - 16:b = t + 32'center the rect
  76. l = (gObjR-gObjL)/2 + gObjL - 16:r = l + 32
  77. LONG IF gObjUser1 < 0'if the button is depressed
  78. CALL OFFSETRECT(t,-1,-1)'move the icon up/left
  79. END IF
  80. '
  81. '      set up font specs and check for vertical room for text
  82. '
  83. TEXT 1,9'Geneva 9
  84. fht = USR FONTHEIGHT'calc text height-insure there's room
  85. IF fht + 32 > (gObjB-gObjT)-gObjUser3*2 THEN fht = 0
  86. iconName$ = ""'default -- no name found
  87. '
  88. '     Look for cicn or ICON. See if there is a resource name
  89. '     that can be used for the button name.
  90. '
  91. LONG IF inColor
  92. LONG IF fht'sufficient vert room for text?
  93. resHndl& = FN GETRESOURCE(_"cicn",gObjUser2)
  94. LONG IF resHndl&
  95. CALL GETRESINFO(resHndl&,ID,tp&,iconName$)
  96. LONG IF LEN(iconName$)
  97. CALL OFFSETRECT(t,0,-fht/2)
  98. END IF
  99. END IF
  100. END IF
  101. cicnHndl& = FN GETCICON(gObjUser2)
  102. XELSE
  103. cicnHndl& = 0
  104. LONG IF fht
  105. resHndl& = FN GETRESOURCE(_"ICON",gObjUser2)
  106. LONG IF resHndl&
  107. CALL GETRESINFO(resHndl&,ID,tp&,iconName$)
  108. LONG IF LEN(iconName$)
  109. CALL OFFSETRECT(t,0,-fht/2)
  110. END IF
  111. END IF
  112. END IF
  113. END IF
  114. '
  115. '                       Mask and draw the ICON or cicn
  116. '
  117. LONG IF cicnHndl&'cicns are easy
  118. CALL PLOTCICON(t,cicnHndl&)'just plot &
  119. CALL DISPOSCICON(cicnHndl&)' dispose
  120. XELSE'black & white ICONs...
  121. ICONHndl& = FN GETICON(gObjUser2)'get the icon
  122. LONG IF ICONHndl&'good handle?
  123. hState = FN HGETSTATE(ICONHndl&)'record handle state
  124. OSErr  = FN HLOCK(ICONHndl&)'lock it
  125. maskHndl& = FN HANDTOHAND(ICONHndl&)'dup for a mask
  126.  
  127. LONG IF maskHndl&'successful duplication?
  128. OSErr = FN HLOCK(maskHndl&)'lock the mask too
  129.  
  130. srcBMap.baseaddr&     = [ICONHndl&]'set up the source bitmap
  131. srcBMap.rowBytes      = 4
  132. srcBMap.bounds.top    = 0
  133. srcBMap.bounds.left   = 0
  134. srcBMap.bounds.bottom = 32
  135. srcBMap.bounds.right  = 32
  136.  
  137. maskBMap = srcBMap'duplicate to the mask bmap
  138. maskBMap.baseaddr&    = [maskHndl&]
  139.  
  140. CALL FORECOLOR(33)'set normal black & white
  141. CALL BACKCOLOR(30)'tehn calc mask
  142.  
  143. CALL CALCMASK([ICONHndl&],[maskHndl&],4,4,32,2)
  144. '
  145. ' Punch a whole in the screen that matches the mask, then draw
  146. ' the ICON.
  147. '
  148. CALL COPYBITS(maskBMap.baseaddr&,#WINDOW(14)+2,maskBMap.bounds,t,_srcBIC,0)
  149. CALL COPYBITS(srcBMap.baseaddr& ,#WINDOW(14)+2,srcBMap.bounds ,t,_srcOR ,0)
  150.  
  151. DEF DISPOSEH(maskHndl&)'dump the mask
  152. END IF
  153.  
  154. OSErr = FN HSETSTATE(ICONHndl&,hState)'restore icon's original state
  155. END IF
  156. END IF
  157. '
  158. '        Draw the text for the button extracted from the cicn or ICON
  159. '        resource name.
  160. '
  161. LONG IF LEN(iconName$)
  162. b = b + fht - 2
  163. wd = FN STRINGWIDTH(iconName$)
  164. objWd = (gObjR - gObjL) - gObjUser3*2 - 2
  165.  
  166. LONG IF wd > objWd
  167. WHILE FN STRINGWIDTH(iconName$) + FN STRINGWIDTH("…")>objWd AND PEEK(@iconName$)>1
  168. POKE @iconName$,PEEK(@iconName$)-1
  169. WEND
  170. iconName$ = iconName$ + "…"
  171. wd = FN STRINGWIDTH(iconName$)
  172. END IF
  173.  
  174. l = 1 + (r-l)/2+l - wd/2
  175.  
  176. LONG IF inColor
  177. CALL TEXTMODE(_srcOR)
  178. FN I3shade(-3*gObjUser3,inColor)
  179. PRINT%(l+1,b+1)iconName$;
  180.  
  181. CALL FORECOLOR(33)
  182. PRINT%(l,b)iconName$;
  183. XELSE
  184. CALL TEXTFACE(0)
  185. CALL TEXTMODE(_srcBIC)
  186. PRINT%(l,b)iconName$;
  187. theFace = (1 << _outlineBit) + (1<<_condenseBit)
  188. CALL TEXTFACE(theFace)
  189. CALL TEXTMODE(_srcOR)
  190. PRINT%(l,b)iconName$;
  191. CALL TEXTFACE(0)
  192. END IF
  193. END IF
  194. FN pGblackAndWhite'restore normal screen params
  195.  
  196. END FN
  197. '_______________________________________________________________________________
  198. LOCAL FN I3frame(inColor)'∑∑œœœœœœœœœœœœœœœœœœœœœœœœœ∑∑
  199. '—————————————————————————————————————————————————————————————————————————————
  200. DIM t,l,b,r'draw the frame in the up
  201. :'    or down position
  202. t;8 = @gObjT
  203. CALL INSETRECT(t,gObjUser3,gObjUser3)
  204. PEN 1,1
  205.  
  206. FOR level = 1 TO gObjUser3'dark/light shade
  207. LONG IF gObjUser1 < 0
  208. inset = -level
  209. XELSE
  210. inset =  level
  211. END IF
  212. FN I3shade(inset,inColor)
  213. PLOT r+(level - 1),t-level TO l-level,t-level TO l-level,b+(level - 1)
  214. FN I3shade(-inset,inColor)
  215. x = level - 1
  216. PLOT r+x,t-x TO r+x,b+x TO l-x,b+x
  217. NEXT
  218. END FN
  219. '_______________________________________________________________________________
  220. LOCAL FN I3update'∑∑œœœœœœœœœœœœœœœœœœœœœœœœœ∑∑
  221. '—————————————————————————————————————————————————————————————————————————————
  222. DIM t,l,b,r
  223.  
  224. LONG IF gObjUserTp& = _"ICN3"'right type?
  225. IF gObjUser3 < 1 THEN gObjUser3 = 1
  226. IF gObjUser3 > 3 THEN gObjUser3 = 3
  227. my = (gObjB-gObjT)/2 + gObjT
  228. mx = (gObjR-gObjL)/2 + gObjL
  229. inColor = FN pGdepthOfPoint(my,mx)'check for color
  230. LONG IF ABS(gObjUser1) > 1
  231. FN I3frame(inColor)'then draw frame
  232. XELSE
  233. FN I3shade(0,inColor)'shade in middle of spectrum
  234. t;8 = @gObjT
  235.  
  236. LONG IF gObjUser1'not disabled
  237. CALL INSETRECT(t,gObjUser3,gObjUser3)'draw center
  238. CALL PAINTRECT(t)
  239. FN I3frame(inColor)'then draw frame
  240. XELSE'disabled
  241. CALL PAINTRECT(t)'mid-shaded background
  242. END IF
  243.  
  244. FN I3ICON(inColor)'put an ICON on top
  245. END IF
  246. END IF
  247. END FN
  248. '_______________________________________________________________________________
  249. LOCAL FN I3audio(boolDown)'∑∑œœœœœœœœœœœœœœœœœœœœœœœœœ∑∑
  250. '—————————————————————————————————————————————————————————————————————————————
  251. LONG IF gSilenceAudio = _false
  252. LONG IF boolDown
  253. SOUND END:SOUND "Click In"
  254. XELSE
  255. SOUND END:SOUND "Click Out"
  256. END IF
  257. END IF
  258. END FN
  259. '_______________________________________________________________________________
  260. LOCAL FN I3Scroll'∑∑œœœœœœœœœœœœœœœœœœœœœœœœœ∑∑
  261. '—————————————————————————————————————————————————————————————————————————————
  262. DIM srcRect.8
  263. DIM destRect.8
  264. srcRect = @gObjT
  265. CALL INSETRECT(srcRect,gObjUser3+1,gObjUser3+1)
  266. destRect = srcRect
  267. LONG IF gObjUser1 = 1'lift up
  268. CALL OFFSETRECT(destRect,1,1)
  269. XELSE'push down (gObjUser1 = -1)
  270. CALL OFFSETRECT(destRect,-1,-1)
  271. END IF
  272. CALL GETPORT(thePort&)
  273. CALL FORECOLOR(33)
  274. CALL BACKCOLOR(30)
  275. CALL COPYBITS(#thePort&+2,#thePort&+2,srcRect,destRect,0,0)
  276. END FN
  277. '_______________________________________________________________________________
  278. LOCAL FN I3click'∑∑œœœœœœœœœœœœœœœœœœœœœœœœœ∑∑
  279. '—————————————————————————————————————————————————————————————————————————————
  280. DIM my,mx
  281. LONG IF gObjUserTp& = _"ICN3"
  282. my = (gObjB-gObjT)/2 + gObjT
  283. mx = (gObjR-gObjL)/2 + gObjL
  284. inColor = FN pGdepthOfPoint(my,mx)'check for color
  285. LONG IF gObjUser1'can't be zero (disabled)
  286. LONG IF ABS(gObjSel) <> 1'part of group?
  287. LONG IF gObjUser1 = 1'up now?
  288. theWnd    = WINDOW(_outputWClass)
  289. thisElem  = gWhichObjElem'record obj element
  290. thisGroup = gObjSel'record group
  291. gObjUser1 = -1'press it
  292. FN pGputObj(theWnd,thisElem)'save new status
  293. FN I3frame(inColor)
  294. FN I3Scroll
  295. FN I3audio(_zTrue)
  296.  
  297. numObjs = FN pGcountObj(theWnd)
  298. FOR loop = 1 TO numObjs
  299. LONG IF thisElem <> loop
  300. FN pGgetObj(theWnd,loop)
  301. LONG IF gObjSel = thisGroup
  302. LONG IF gObjUser1 = -1'down now?
  303. gObjUser1 = 1'pop it up
  304. FN pGputObj(theWnd,loop)'save new status
  305. FN I3frame(inColor)
  306. FN I3Scroll
  307. END IF'end of gObjUser1 = -1
  308. END IF'end of gObjSel = thisGroup
  309. END IF'end of thisElem <> loop
  310. NEXT loop
  311. FN pGgetObj(theWnd,thisElem)'restore element for .MAIN
  312.  
  313. END IF
  314. XELSE'not part of group
  315. LONG IF gObjUser1 = 1'up now?
  316. DO'while mouse btn down
  317. CALL GETMOUSE(my)'get current pos
  318. LONG IF FN PTINRECT(my,gObjT)'in control?
  319. LONG IF gObjUser1 = 1'wasn't on last check?
  320. gObjUser1 = -1'push it down
  321. FN I3frame(inColor)
  322. FN I3Scroll
  323. FN I3audio(_zTrue)
  324. END IF
  325. XELSE'not in user item?
  326. LONG IF gObjUser1 = -1'was in item on last check
  327. gObjUser1 = 1'let it rise
  328. FN I3frame(inColor)
  329. FN I3Scroll
  330. FN I3audio(_false)
  331. END IF
  332. END IF
  333. UNTIL FN STILLDOWN = _false
  334.  
  335. LONG IF gObjUser1 = -1'down at last check?
  336. gObjUser1 = 1'spring up on mouse release
  337. FN I3frame(inColor)
  338. FN I3Scroll
  339. FN I3audio(_false)
  340. XELSE
  341. gAction = 0
  342. END IF
  343.  
  344. END IF'end of up at start
  345. END IF'end of grouped/not
  346.  
  347. LONG IF gSilenceAudio = _false'clicking?
  348. WHILE SOUND%'wait till sound finished
  349. WEND
  350. SOUND END'release channel
  351. END IF
  352.  
  353. END IF'end of non-zero (disabled)
  354. END IF'end of _"ICN3" type
  355. END FN
  356. '_______________________________________________________________________________
  357. LOCAL FN I3Cursor
  358. '———————————————————————————————————————————————————————————————————————————————
  359. DIM my,mx
  360. theWindow = WINDOW(_activeWClass)
  361. overICN3  = _false
  362. LONG IF theWindow'window open?
  363. CALL GETMOUSE(gMouseY)
  364. theObject = FN pGpointInObj
  365. LONG IF theObject'mouse over object?
  366. FN pGgetObj(theWindow,theObject)
  367. LONG IF gObjUserTp& = _"ICN3"'3D button?
  368. LONG IF gObjUser1 = 1'clickable?
  369. overICN3  = _zTrue
  370. END IF'end gObjUser1   =  1
  371. END IF'end gObjUserTp& =  _"ICN3"
  372. END IF'end theObject  < > 0
  373. END IF'end theWindow  < > 0
  374.  
  375. LONG IF gI3Cursor'was originally over ICN3
  376. LONG IF overICN3 = _false'is not over now
  377. gI3Cursor = _false'clear flag
  378. IF SYSTEM(_lastCurs) THEN CURSOR 0'set back to arrow
  379. END IF
  380. XELSE'was not originally over ICN3
  381. LONG IF overICN3'is now over now
  382. gI3Cursor = _zTrue'set flag
  383. CURSOR _fingerCursor'set back to arrow
  384. END IF
  385. END IF
  386. END FN
  387. '_______________________________________________________________________________
  388. '€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ EDIT FILTER €€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€
  389. '———————————————————————————————————————————————————————————————————————————————
  390. "ICN3 Filter"
  391. RETURN
  392. "ICN3"
  393. LONG IF gAction = _otherAction
  394. SELECT gSubAction
  395. CASE _otherCursor    :gI3Cursor = _false
  396. CASE _otherNullEvent :FN I3Cursor
  397. CASE _otherFilterEvent'skip over quickly
  398. CASE _otherUserUpdate:FN I3update
  399. CASE _otherUserClick :FN I3click
  400. END SELECT
  401. END IF
  402.  
  403.